package ferrovia;

/**
 * Interface a ser implementada pelo Centro de Controle, que ser� o respons�vel pelo tratamento
 * de eventos gerados pela malha ferrovi�ria.
 *   Define os m�todos chamados pela malha ferrovi�ria na ocorr�ncia de cada evento gerado pela malha..
 *   Todo evento tem as seguintes informa��es:
 *   - tipo do evento: o tipo de evento � impl�cito pelo m�todo sendo chamado.
 *   - id_origem: identifica��o �nica do elemento que gerou o evento (composi��o ou trecho de ferrovia)
 *   - instante da ocorr�ncia do evento
 *   - dados do evento (cada tipo de evento tem o conjunto pr�prio de dados, descritos junto com cada 
 *     m�todo.
 * @author Fernando Vanini
 *
 */

public interface TratadorDeEventos extends DefsGlobais{
	
	/**
	 * Evento de alarme gerado por uma composi��o, por falha de opera��o
	 * @param idComposicao   Identifica��o �nica da composi��o
	 * @param instanteAtual  Instante da ocorr�ncia do evento
	 * @param tipoDeFalha    Tipo da falha: (Acelera��o, Freio, Outra [ ver defini��es em DefsGlobais.java])
	 */
	public void alarmeComposicao(String idComposicao, int instanteAtual, TipoFalha tipoDeFalha );
	
	/**
	 * Evento gerado pela composi��o quando a mesma inicia sua viagem.
	 * @param idComposicao   Identifica��o �nica da composi��o
	 * @param instanteAtual  Instante da ocorr�ncia do evento
	 * @param idTrecho       Identifica��o �nica do trecho de onde a composi��o parte.
	 */
	public void partidaComposicao(String idComposicao, int instanteAtual, String idTrecho);
	
	/**
	 * Evento gerado pela composi��o quando esta chega ao seu destino.
	 * @param idComposicao  Identifica��o �nica da composi��o.
	 * @param instanteAtual Instante da ocorr�ncia do evento.
	 * @param idTrecho      Identifica��o do trecho pelo qual ocorreu a chegada.
	 */
	public void chegadaComposicao(String idComposicao, int instanteAtual, String idTrecho);
	
	/**
	 * Evento de alarme gerado pela chave, por falha de opera��o.
	 * @param idChave         Identifica��o �nica da chave que gerou o alarme.
	 * @param instanteAtual   Instante da ocorr�ncia do evento.
	 * @param tipoDeFalha     Tipo de falha da chave.
	 */
	public void alarmeChave(String idChave, int instanteAtual, TipoFalha tipoDeFalha );	
	
	/**
	 * Evento gerado pela passagem de uma composi��o por um sensor.
	 * @param idTrecho       Identifica��o �nica do trecho que gerou o evento.
	 * @param instanteAtual  Instante da ocorr�ncia do evento.
	 * @param posicao        Posi��o do sensor que gerou o evento, relativa � extremidade A do sensor.
	 * @param idComposicao   Identifica��o �nica da composi��o.
	 * @param velocidade     Velocidade da composi��o no instante da passagem.
	 * @param sentidoAB      Sentido da passagem (AB => true, BA => false)
	 */
	public void passagemComposicao(String idTrecho, int instanteAtual, int posicao, String idComposicao, float velocidade, boolean sentidoAB);
	
	/**
	 * Evento gerado pela entrada de uma composi��o numa chave.
	 * @param idChave           Identifica��o �nica da chave que gerou o evento.
	 * @param instanteAtual     Instante da ocorr�ncia do evento.
	 * @param idComposicao      Identifica��o da composi��o que entrou na chave
	 * @param idTrechoOrigem   Identifica��o do trecho de onde veio a composi��o
	 */
	public void entradaComposicaoChave(String idChave, int instanteAtual, String idComposicao, String idTrechoOrigem);

	/**
	 * Evento gerado pela sa�da de uma composi��o de uma chave.
	 * @param id_chave          Identifica��o �nica da chave que gerou o evento.
	 * @param instanteAtual     Instante da ocorr�ncia do evento.
	 * @param idComposicao      Identifica��o da composi��o que saiu da chave
	 * @param idTrechoDestino   Identifica��o do trecho para onde est� indo a composi��o
	 */
	public void saidaComposicaoChave(String idChave, int instanteAtual, String idComposicao, String idTrechoDestino);
	
	/**
	 * Evento gerado para cada 'tic' do rel�gio do simulador.
	 * @param instanteAtual instante em que o 'tic' ocorre (relativo ao in�cio da simula��o)
	 */
	public void tic(int instanteAtual);
}
